# -*- coding: utf-8 -*-
# @Time    : 2024/6/19 16:09
# @Author  : yujiahao
# @File    : 31_print.py
# @description:

# print_utils.py

def print_basic():
    """
    打印基本字符串。
    """
    print("Hello, World!")


def print_multiple_values():
    """
    打印多个值，默认用空格分隔。
    """
    print("Hello", "World", 123)


def print_with_separator():
    """
    打印多个值，用指定的分隔符分隔。
    """
    print("Hello", "World", sep=", ")


def print_with_end():
    """
    打印多个值，末尾不换行，用指定的字符结尾。
    """
    print("Hello", end=" ")
    print("World")


def print_to_file():
    """
    打印输出到文件。
    """
    with open("output.txt", "w") as file:
        print("Hello, World!", file=file)


def print_with_flush():
    """
    打印输出并立即刷新缓冲区。
    """
    print("Hello, World!", flush=True)


def print_formatted_fstring(name, age):
    """
    使用 f-string 格式化字符串并打印。

    参数:
    name (str): 名字
    age (int): 年龄
    """
    print(f"Name: {name}, Age: {age}")


def print_formatted_format(name, age):
    """
    使用 str.format() 格式化字符串并打印。

    参数:
    name (str): 名字
    age (int): 年龄
    """
    print("Name: {}, Age: {}".format(name, age))


def print_formatted_percent(name, age):
    """
    使用 % 运算符格式化字符串并打印。

    参数:
    name (str): 名字
    age (int): 年龄
    """
    print("Name: %s, Age: %d" % (name, age))


def print_object(obj):
    """
    打印对象，调用对象的 __str__ 或 __repr__ 方法。

    参数:
    obj: 要打印的对象
    """
    print(obj)

    '''

        在 Python 中，可以使用 ANSI 转义序列来实现终端中带颜色的输出。以下是如何使用 ANSI 转义序列实现带颜色输出的详细说明和示例。

        1. ANSI 转义序列格式

        ANSI 转义序列的格式如下：
        
        【开头部分】
        
        \033[显示方式;前景色;背景色m
        
        【结尾部分】
        
        \033[0m
        
        注意：开头部分的三个参数：
        - 显示方式: 控制文本的显示效果，如高亮、下划线、闪烁等。
        - 前景色: 控制文本的颜色。
        - 背景色: 控制文本背景的颜色。
        
        是可选参数，可以只写其中的某一个；另外由于表示三个参数不同含义的数值都是唯一的没有重复的，
        所以三个参数的书写先后顺序没有固定要求，系统都能识别；但是，建议按照默认的格式规范书写。
        对于结尾部分，其实也可以省略，但是为了书写规范，建议\033[开头，\033[0m结尾
        
        
        2. 常用颜色代码

        | 字体颜色 | 背景颜色 | 颜色描述  |
        |----------|----------|-----------|
        | 30       | 40       | 黑色      |
        | 31       | 41       | 红色      |
        | 32       | 42       | 绿色      |
        | 33       | 43       | 黄色      |
        | 34       | 44       | 蓝色      |
        | 35       | 45       | 紫红色    |
        | 36       | 46       | 青蓝色    |
        | 37       | 47       | 白色      |

        3. 常用显示方式代码

        | 显示方式 | 效果           |
        |----------|----------------|
        | 0        | 终端默认设置   |
        | 1        | 高亮显示       |
        | 4        | 使用下划线     |
        | 5        | 闪烁           |
        | 7        | 反白显示       |
        | 8        | 不可见         |
        
        
        4.举例说明
        
        常见开头格式： \033[0m 默认字体正常显示，不高亮 \033[32;0m 红色字体正常显示 \033[1;32;40m 显示方式: 高亮 字体前景色：绿色 背景色：黑色 \033[0;31;46m 显示方式: 正常 字体前景色：红色 背景色：青色

        举例说明：
        
        print('\033[1;35;0m字体变色，但无背景色 \033[0m')  # 有高亮
        print('\033[1;35m字体有色，但无背景色 \033[0m')    # 有高亮
        print('\033[1;45m 字体不变色，有背景色 \033[0m')  # 有高亮
        print('\033[1;35;46m 字体有色，且有背景色 \033[0m')  # 有高亮
        print('\033[0;35;46m 字体有色，且有背景色 \033[0m')  # 无高亮

    '''


def print_colored(text, display_mode=0, foreground_color=37, background_color=40):
    """
    打印带颜色的文本。

    参数:
    text (str): 要打印的文本
    display_mode (int): 显示方式 (默认: 0)
    foreground_color (int): 前景色 (默认: 37 - 白色)
    background_color (int): 背景色 (默认: 40 - 黑色)
    """
    print(f'\033[{display_mode};{foreground_color};{background_color}m{text}\033[0m')


# 示例类，用于演示打印对象
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    '''
    如果不重写字符串方法，则默认打印一个包含对象类型和内存地址的字符串。
    为了使对象在打印时显示更有意义的信息，可以在类中定义 __str__ 和 __repr__ 方法。

        __str__：用于定义“用户友好”的字符串表示，print() 函数会调用它。
        __repr__：用于定义“开发者友好”的字符串表示，通常用于调试。如果没有定义 __str__ 方法，print() 会调用 __repr__。
    '''

    def __str__(self):
        return f"Person(name={self.name}, age={self.age})"

    def __repr__(self):
        return f"Person(name={self.name}, age={self.age})"


# 示例用法
if __name__ == "__main__":
    print_basic()
    print_multiple_values()
    print_with_separator()
    print_with_end()
    print_to_file()
    print_with_flush()
    print_formatted_fstring("Alice", 30)
    print_formatted_format("Bob", 25)
    print_formatted_percent("Charlie", 35)

    # 带颜色直接输出 就根据上面两个表写就行，没啥滑头
    print('\033[1;35;0m字体变色，但无背景色 \033[0m')  # 有高亮
    print('\033[1;35m字体有色，但无背景色 \033[0m')  # 有高亮
    print('\033[1;45m 字体不变色，有背景色 \033[0m')  # 有高亮
    print('\033[1;35;46m 字体有色，且有背景色 \033[0m')  # 有高亮
    print('\033[0;35;46m 字体有色，且有背景色 \033[0m')  # 无高亮

    # 或者下面使用
    print('\033[0;36m骑牛远远过前村，')
    print('短笛横吹隔陇闻。')
    print('多少长安名利客，')
    print('机关用尽不如君。\033[0m')

    # 使用方法打印带颜色的文本
    print_colored("字体变色，但无背景色", display_mode=1, foreground_color=35)
    print_colored("字体有色，但无背景色", display_mode=1, foreground_color=35)
    print_colored("字体不变色，有背景色", display_mode=1, background_color=45)
    print_colored("字体有色，且有背景色", display_mode=1, foreground_color=35, background_color=46)
    print_colored("字体有色，且有背景色", display_mode=0, foreground_color=35, background_color=46)

    p = Person("Dave", 40)
    print_object(p)
